根據區塊鏈的歷史
區塊鏈的基礎概念 可以溯源到很早的時候
不過當時之所以沒有運行起來
便是因為尚有一些難題未解決(包括 共識機制、去中心化等等)
而現在看區塊鏈型似乎是件很自然的事
因此就是必須要 實際區搭建一個區塊鏈 方能理解其中的困難處
為此 創建區塊鏈必須實現的功能
最後再根據以上資訊 建立
首先 我們必須知道
區塊鏈網路是 點對點(P2P)
因此如上圖展示一般 每個節點都是公平的且能互相傳輸訊息
節點的作用是甚麼?
節點必須存在的功能
由於是 點對點(P2P) 網路架構
因此會希望 是屬於長連線
能隨時回應資訊 與 隨時主動傳遞資訊
並且希望內容正確不要遺失最好
所以綜合上面需求 該建立基於 TCP 之上的協定
接下來再看到 關於一個節點 在區塊鏈中 所需要的詳細功能
由上圖 可以看到有很多種傳輸內容
在後面的篇章會為每一個傳輸內容界定格式
(每個傳過去的物件要有甚麼屬性之類的)
並且界定成功與否的狀態還有相對解決方法
資訊出發節點 | 資訊接收節點 | |
---|---|---|
歷史區塊詢問 | 詢問歷史區塊 | 回傳給該節點歷史區塊 |
(外部)交易接收 | 確認後 廣播出去 | 確認後 再廣播出去 |
(外部)交易詢問 | 回傳查詢資訊 | |
(內部)交易廣播 | 確認後 廣播出去 | 確認後 再廣播出去 |
(內部)區塊廣播 | 計算後 廣播出去 | 確認後 再廣播出去 |
對於區塊鏈中的資料庫
對於需要在區塊鏈結點鐘建立的資料庫如下
在區塊鏈設計中
每個節點都應該要有一份區塊鏈資訊的備份
因此這個資料庫就是來儲存區塊的
而通常儲存區塊的方式 是採用 鍵值型(Key-Value)資料庫
資料庫型態 | |
---|---|
鍵(Key) | 區塊哈希(BlockHash) |
值(Value) | 整個區塊資訊 |
因此透過此方式 就能從區塊哈希值 找到一個區塊
UTXO 全文是 Unspent Transaction Output
代表著未花費的輸出
其實邏輯上 就可以認為是紀錄該個帳戶有多錢的資料庫
有點像是銀行紀錄 一個帳戶有多少錢
不過並非是透過 直接多少錢紀錄
而是 紀錄是否之前有其他帳戶轉錢給當前帳戶且未花費
藉此推斷帳戶裡有多少餘額
資料庫型態 | |
---|---|
鍵(Key) | 交易哈希(TransactionHash) |
索引(Index) | 索引 |
值(Value) | 包含 地址、金額、已花費沒 |
會發現 透過上方區塊資料庫是無法得知最後一個區塊位置的
因此要再建一個資料庫紀錄其他關於區塊的訊息。
由此根據找到最後一區塊並開始機計算新的區塊。
首先對於區塊計算 先展示所需要的程序(平行運算程序)
(5+N程序規劃) 代表 5個基本程序 加上 N個礦工程序
主要想透過平行畫運算 大幅提升挖礦效率
有效發揮現代多核心CPU的運算效率
由上圖進行解釋
資料出發點 | 資料內容 | 資料接收點 |
---|---|---|
"廣播系統" | 新的交易 | "接收驗證交易" |
- | - | - |
"接收驗證交易" | 驗證後 交易無誤後 廣播該筆交易 | "廣播系統" |
"接收驗證交易" | 驗證後 交易無誤後 更新區塊交易 | "刷新區塊" |
- | - | - |
"刷新區塊" | 更新區塊內容 | "礦工管理者" |
- | - | - |
"礦工管理者" | 新的區塊 加 不同計算範圍 | "礦工們" |
- | - | - |
"礦工們" | 計算成功後 回傳成功區塊 | "礦工管理者" |
資料出發點 | 資料內容 | 資料接收點 |
---|---|---|
"礦工管理者" | 傳送成功區塊 | "接收驗證區塊" |
"廣播系統" | 新的區塊 | "接收驗證區塊" |
- | - | - |
"接收驗證區塊" | 驗證後 區塊無誤後 廣播該筆交易 | "廣播系統" |
"接收驗證區塊" | 驗證後 區塊無誤後 更新區塊資料庫 | "刷新資料庫" |
- | - | - |
"刷新資料庫" | 更新區塊資料庫內容 | "刷新區塊" |
- | - | - |
"刷新區塊" | 更新區塊內容 | "礦工管理者" |
- | - | - |
"礦工管理者" | 新的區塊 加 不同計算範圍 | "礦工們" |
透過以上方式便能不斷接收 交易 或 區塊 進而去計算區塊鏈
在此在計算時 也必須符合共識機制的限制
因此 必須先限定 共識機制的內容
由此可以確認區塊鏈的在不同節點 共同性
(避免不同節點不同資訊)
以及對於分鏈的出現如何解決
提供給使用者 一個方便的接口 非常重要
透過以上設計
從 節點加入 到 整體運作 到 客戶端使用
從上方已能看到基本的雛型
首先來看系統架構圖(左方為建立礦工節點 右方為調動API)
再來實現上 則使用 Go 這門語言
(高效能、內建網路相關函式、輕鬆建立平行化程序)
最主要是採用是因為 goroutine 的設計
使要開發平行化程序 高效又輕鬆
專案架構組織
├── api # 相關API撰寫位置
│
├── database # 資料庫相關事務
│
├── protocal # 節點建立、連線與溝通
│
├── initalize # 初始化
│
├── service # 5+N 相關程序
│
├── block_structure # 區塊架構
│
├── utils # 其餘相關輔助功能
│
├── main.go # 主程序
哇 總算結束拉~~
可以感受得出來
區塊鏈的建立是件不簡單的事
難怪有人會說 中本聰(比特幣創始人) 是從未來穿越回來的
當然在此必須先說 像是許多區塊鏈程序碼都是開源的
邏輯上 不用重複造輪子 再自己寫(包括協定、共識等等)
但是我認為 與這技能是否能使用、是否有意義無關
而是單純想實際去撰寫一遍 才能更理解它的本質
希望看完這篇能理解
經過基本的規劃
想對於實現區塊鏈 應該是胸有成竹了吧?
應該吧? 哈哈哈哈 我講的也很心虛!
基本上就 Step by step 吧!
首先來面對 基本的區塊與鏈的結構